// 准备数据
const o1 = {
  name: "Jack",
  age: 18,
  info: {
    height: 180,
    weight: 180,
    desc: {
      message: "今天天气很好",
    },
  },
  address: {
    city: "北京",
  },
  hobby: ["吃饭", "睡觉"],
};
// 准备一个空对象
const o2 = {};
// 要实现深拷贝 我们就准备一个函数
function deepCopy(o2, o1) {
  // 首先我们还是要通过循环遍历的方式拿到原始数据类型中的数据
  for (let k in o1) {
    // 因为我们不知道里面都有什么数据所以我们要先判断
    if (Object.prototype.toString.call(o1[k]) === "[object Object]") {
      // 代码能进入到这里说明是一个对象
      o2[k] = {};
      // 再次进行拷贝 这个过程和我们刚做的是不是一样
      // 那我就直接调用我们的deepCopy函数就好
      deepCopy(o2[k], o1[k]);
    } else if (Object.prototype.toString.call(o1[k]) === "[object Array]") {
      // 代码能执行到这里说明是一个数组
      o2[k] = [];
      // 继续执行我们的拷贝函数
      deepCopy(o2[k], o1[k]);
    } else {
      o2[k] = o1[k];
    }
  }
}
// 使用
deepCopy(o2, o1);
console.log(o1, o2);
o1.info.height = 300;
console.log(o1, o2);


// ================
function deepCopy(obj) {
  if (typeof obj !== 'object' || obj === null) {
    // 如果不是对象类型或者是null，则直接返回
    return obj;
  }

  let copy = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      copy[key] = deepCopy(obj[key]);
    }
  }

  return copy;
}

// 用法示例
let originalObj = {
  name: "Fitten",
  age: 1,
  details: {
    hobby: "coding",
    job: "AI assistant"
  }
};

let copiedObj = deepCopy(originalObj);
console.log(copiedObj);

